package com.algorithm.array;

import java.util.Arrays;

/**
 * Created by dongxie on 2021/12/9.
 * 有序数组的平方
 * https://leetcode-cn.com/problems/squares-of-a-sorted-array/
 */
public class SquaresOfSortedArray {
    public static void main(String[] args) {

    }

    /**
     * F1:暴力解法
     * 每个数平方之后，排个序
     *
     * @param nums
     * @return
     */
    public int[] sortedSquares1(int[] nums) {
        for (int i = 0; i < nums.length; i++) {
            nums[i] = nums[i] * nums[i];
        }
        Arrays.sort(nums);
        return nums;
    }

    /**
     * F2:双指针法
     * 数组其实是有序的， 只不过负数平方之后可能成为最大数了。
     * 那么数组平方的最大值就在数组的两端，不是最左边就是最右边，不可能是中间。
     * 此时可以考虑双指针法了，i指向起始位置，j指向终止位置。
     * 定义一个新数组result，和A数组一样的大小，让k指向result数组终止位置。
     * 如果A[i] * A[i] < A[j] * A[j] 那么result[k--] = A[j] * A[j]; 。
     * 如果A[i] * A[i] >= A[j] * A[j] 那么result[k--] = A[i] * A[i]; 。
     *
     * @param nums
     * @return
     */
    public int[] sortedSquares2(int[] nums) {
        int left = 0;
        int right = nums.length - 1;
        int k = right;
        int[] results = new int[nums.length];
        while (left <= right) { // 注意这里要i <= j，因为最后要处理两个元素
            if (nums[left] * nums[left] < nums[right] * nums[right]) {
                results[k--] = nums[right] * nums[right];
                right--;
            } else {
                results[k--] = nums[left] * nums[left];
                left++;
            }
        }
        return results;
    }

}
